using System.ComponentModel.DataAnnotations.Schema;
using UniversalAdmin.Domain.Entities;

namespace UniversalAdmin.Domain.Common;

// 聚合根基类 - 提供领域事件管理功能
// 所有聚合根都应该继承此类
public abstract class AggregateRoot : EntityBase
{

    // 领域事件集合 - 存储待发布的事件
    private readonly List<IDomainEvent> _domainEvents = new();

    // 只读的领域事件集合 - 供基础设施层读取和发布
    // NotMapped确保EF Core不会将其映射到数据库
    [NotMapped]
    public IReadOnlyCollection<IDomainEvent> DomainEvents => _domainEvents.AsReadOnly();


    // 构造函数
    protected AggregateRoot() : base()
    {
    }


    // 添加领域事件到待发布队列
    // 受保护方法，只允许聚合根内部调用
    protected void AddDomainEvent(IDomainEvent domainEvent)
    {
        if (domainEvent == null)
            throw new ArgumentNullException(nameof(domainEvent));

        _domainEvents.Add(domainEvent);
    }


    // 清空领域事件集合
    // 通常在事件发布后调用，防止重复发布
    public void ClearDomainEvents()
    {
        _domainEvents.Clear();
    }


    // 移除指定的领域事件
    public void RemoveDomainEvent(IDomainEvent domainEvent)
    {
        if (domainEvent != null)
        {
            _domainEvents.Remove(domainEvent);
        }
    }


    // 检查是否有待发布的事件
    public bool HasDomainEvents => _domainEvents.Any();
}
